package com.task.controller.param.impl;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.task.controller.annotation.Param;
import com.task.controller.annotation.impl.ParameterImpl;
import com.task.controller.param.ParamParser;
import com.task.controller.parser.ParameterParser;
import ohos.app.Context;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class MapParser implements ParamParser {

    @Override
    public Object parse(Context context, Object o, Method method) {
        Parameter[] parameters = method.getParameters();
        List<Object> list = new ArrayList<>();
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
        Map<String, Object> map = gson.fromJson(String.valueOf(o), new TypeToken<Map<String, Object>>() {
        }.getType());
        for (Parameter parameter : parameters) {
            Param param = parameter.getDeclaredAnnotation(Param.class);
            String name;
            if (param == null) {
                name = parameter.getName();
            } else {
                name = param.name();
            }
            Object cache = map.get(name);
            com.task.controller.annotation.Parameter annotation = parameter.getDeclaredAnnotation(com.task.controller.annotation.Parameter.class);
            if (annotation == null) {
                list.add(cache);
            } else {
                try {
                    ParameterParser<?> parameterParser = ParameterImpl.createParameterParser(annotation.parser());
                    list.add(parameterParser.parameterParser(context, cache));
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
        return list.toArray();
    }
}
